#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include "threads_pool.h"

// 测试任务函数1
void* task_func1(void* arg) {
    int task_id = *(int*)arg;
    printf("任务 %d 正在被线程 %lu 处理\n", task_id, (unsigned long)pthread_self());
    sleep(1); // 模拟任务处理时间
    printf("任务 %d 已完成\n", task_id);
    return NULL;
}

// 测试任务函数2
void* task_func2(void* arg) {
    char* message = (char*)arg;
    printf("消息任务: %s (线程 %lu)\n", message, (unsigned long)pthread_self());
    sleep(2); // 模拟任务处理时间
    return NULL;
}

// 测试任务函数3（长时间运行）
void* long_task_func(void* arg) {
    int duration = *(int*)arg;
    printf("长时间任务开始，将运行 %d 秒 (线程 %lu)\n", 
           duration, (unsigned long)pthread_self());
    sleep(duration);
    printf("长时间任务在 %d 秒后完成\n", duration);
    return NULL;
}

int main() {
    printf("=== 线程池测试程序 ===\n\n");
    
    // 创建线程池：初始2个线程，最大等待任务5个，最大活跃线程4个
    ThreadsPoolMsg_st_pt pool = getNewThreadsPoolMsg(2, 5, 4);
    if (!pool) {
        fprintf(stderr, "创建线程池失败\n");
        return 1;
    }
    printf("线程池创建成功，初始有 %d 个线程\n", pool->activeThreadsCot);
    
    // 测试1：添加多个任务
    printf("\n--- 测试1: 添加多个任务 ---\n");
    int task_ids[5] = {1, 2, 3, 4, 5};
    
    for (int i = 0; i < 5; i++) {
        if (addNewTask(pool, task_func1, &task_ids[i]) != 0) {
            printf("添加任务 %d 失败\n", i+1);
        } else {
            printf("任务 %d 已添加到线程池\n", i+1);
        }
    }
    
    sleep(3); // 等待任务执行
    
    // 测试2：添加线程
    printf("\n--- 测试2: 添加线程 ---\n");
    if (addThread(pool) == 0) {
        printf("线程添加成功。当前有 %d 个活跃线程\n", pool->activeThreadsCot);
    } else {
        printf("添加线程失败\n");
    }
    
    // 测试3：添加更多任务
    printf("\n--- 测试3: 添加更多任务 ---\n");
    char* messages[] = {"你好", "世界", "测试", "消息"};
    
    for (int i = 0; i < 4; i++) {
        if (addNewTask(pool, task_func2, messages[i]) != 0) {
            printf("添加消息任务 %d 失败\n", i+1);
        } else {
            printf("消息任务 %d 已添加\n", i+1);
        }
    }
    
    sleep(5); // 等待任务执行
    
    // 测试4：减少线程
    printf("\n--- 测试4: 减少线程 ---\n");
    if (reduceThread(pool) == 0) {
        printf("线程减少成功。当前有 %d 个活跃线程\n", pool->activeThreadsCot);
    } else {
        printf("减少线程失败\n");
    }
    
    // 测试5：添加长时间运行的任务
    printf("\n--- 测试5: 添加长时间运行的任务 ---\n");
    int long_duration = 3;
    if (addNewTask(pool, long_task_func, &long_duration) == 0) {
        printf("长时间任务已添加\n");
    } else {
        printf("添加长时间任务失败\n");
    }
    
    sleep(2); // 等待一段时间
    
    // 测试6：销毁线程池（会等待所有任务完成）
    printf("\n--- 测试6: 销毁线程池 ---\n");
    printf("正在销毁线程池（将等待所有任务完成）...\n");
    destroyThreadsPoolMsg(pool);
    printf("线程池销毁成功\n");
    
    printf("\n=== 所有测试完成 ===\n");
    return 0;
}